# excel_to_dm.py
import time

import pandas as pd
#from sqlalchemy import create_engine
from validator import validate_with_config
from upload_to_sql import upload_to_sql, safe_upload_to_dm
from dm_connection import connect_dm
from datetime import datetime
import os
import sys

# 配置
excel_file = sys.argv[1]
front_uuid = sys.argv[2]
# excel_file = "榆林最新测试数据.xlsx"
# front_uuid = 'abcd'




def import_excel_to_dataframe(excel_file: str, front_uuid):
    if not os.path.exists(excel_file):
        print(f"❌ Excel文件不存在: {excel_file}")
        return

    xl = pd.ExcelFile(excel_file)
    print(f"📄 工作表列表: {xl.sheet_names}")

    all_dataframes = {}
    all_passed = True
    skip_tables = []
    successfully_written_tables = []

    for sheet_name in xl.sheet_names[1:]:
        df = xl.parse(sheet_name, engine='openpyxl', header=1, skiprows=[2], dtype=str)
        print(f"\n🔄 正在处理工作表: {sheet_name}")
        try:
            # # 处理特定工作表：'风险登记' 和 '应急物资'
            # if sheet_name in ["风险登记", "应急物资"]:
            #     # 替换 'nan' 字符串为 NaN
            #     df.replace('nan', pd.NA, inplace=True)

            #     # 强制将所有数据列转换为字符串
            #     df = df.applymap(str)

            #     print(f"处理工作表 {sheet_name}，确保编码为UTF-8")


            #字段中文映射成数字
            if sheet_name == '企业基本信息':

                type_mapping = {'煤矿': '1', '油田': '2', '气田': '3', '国有重点': '4'}
                df['企业类型'] = df['企业类型'].map(type_mapping)

                type_mapping1 = {'爆破采煤工艺': '1', '普通机械化采煤工艺': '2', '综合机械化采煤工艺': '3', '螺旋钻采煤工艺': '4', '水力采煤工艺': '5'}
                df['工艺类型'] = df['工艺类型'].map(type_mapping1)

                type_mapping2 = {'极复杂': '1', '复杂': '2', '中等': '3', '简单': '4'}
                df['水文地质条件'] = df['水文地质条件'].map(type_mapping2)

            if sheet_name == '重大设备':

                type_mapping = {'使用中': '1', '报废': '2', '故障': '3', '库存': '4', '其他': '5'}
                df['设备状态'] = df['设备状态'].map(type_mapping)

            if sheet_name == '危险源类型':

                type_mapping = {'生产工艺': '1', '设备设置': '2', '作业环境': '3', '人员行为': '4', '管理体系': '5'}
                df['危险源类型'] = df['危险源类型'].map(type_mapping)

                type_mapping1 = {'低危险': '1', '一般危险': '2', '重大危险': '3', '特别重大危险': '4'}
                df['危险源等级'] = df['危险源等级'].map(type_mapping1)

            if sheet_name == '隐患登记':

                type_mapping = {'一般隐患': '1', '重大隐患': '2'}
                df['隐患级别'] = df['隐患级别'].map(type_mapping)

                type_mapping1 = {'物的危险状态': '1', '人的不安全行为': '2', '管理上的缺陷': '3'}
                df['隐患因素'] = df['隐患因素'].map(type_mapping1)

            if sheet_name == '风险登记':

                type_mapping = {'瓦斯事故风险': '1', '水灾事故风险': '2', '火灾事故风险': '3', '顶板事故风险': '4', '机电事故风险': '5', '运输事故风险': '6', '放炮事故风险': '7', '其他事故风险': '8', '甲烷事故风险': '9', '一氧化 碳事故风险': '10'}
                df['风险点类型'] = df['风险点类型'].map(type_mapping)

                type_mapping1 = {'低风险': '0', '一般风险': '1', '较大风险': '2', '重大风险': '3'}
                df['风险点等级'] = df['风险点等级'].map(type_mapping1)

            if sheet_name == '安全生产投入':

                type_mapping = {'措施工程': '01', '购买设备': '02', '日常维护': '03', '课题研究': '04', '劳保用品': '05', '培训教 育': '06', '其他': '07'}
                df['投入类型'] = df['投入类型'].map(type_mapping)

            if sheet_name == '应急预案':

                type_mapping = {'瓦斯事故风险': '1', '水灾事故风险': '2', '火灾事故风险': '3', '顶板事故风险': '4', '机电事故风险': '5', '运输事故风险': '6', '放炮事故风险': '7', '其他事故风险': '8', '甲烷事故风险': '9', '一氧化 碳事故风险': '10'}
                df['风险类型'] = df['风险类型'].map(type_mapping)

                type_mapping1 = {'低风险': '0', '一般风险': '1', '较大风险': '2', '重大风险': '3'}
                df['风险等级'] = df['风险等级'].map(type_mapping1)

                type_mapping2 = {'一级响应': '1', '二级响应': '2', '三级响应': '3', '四级响应': '4'}
                df['响应等级'] = df['响应等级'].map(type_mapping2)

                type_mapping3 = {'物体打击': '1', '车辆伤害': '2', '机械伤害': '3', '触电': '4', '淹溺': '5', '灼烫': '6', '火灾': '7', '高处坠落': '8', '透水': '9', '瓦斯爆炸': '10'}
                df['针对事故类型'] = df['针对事故类型'].map(type_mapping3)

            if sheet_name == '应急预案-人员信息':

                type_mapping = {'抢险救援': '1', '医疗救护': '2', '后勤保障': '3'}
                df['人员类型'] = df['人员类型'].map(type_mapping)

            if sheet_name == '应急专家':

                type_mapping = {'冒顶事故专家': '1', '矿井水灾事故专家': '2', '矿井火灾事故专家': '3', '瓦斯（煤尘）爆炸事故专家': '4', '爆破事故专家': '5', '井下机电运输类事故专家': '6', '职业危害事故专家': '7', '采掘专家': '8', '地测防治水专家': '9', '通风专家': '10'}
                df['专家类型'] = df['专家类型'].map(type_mapping)

            if sheet_name == '采掘工作面信息':

                type_mapping = {'掘进工作面': '1','回采工作面': '2'}
                df['采掘工作面类型'] = df['采掘工作面类型'].map(type_mapping)

            

            #特殊编码格式处理



            if sheet_name == '隐患登记':

                df['罚款金额'] = df['罚款金额'].fillna(0)

            

            if sheet_name == '风险登记':

                
                df['风险点名称'] = df['风险点名称'].str.replace(r'\s*㎡\s*', 'xl', regex=True)
                df['风险点名称'] = df['风险点名称'].str.replace(r'\s*m³\s*', 'xl', regex=True)

            if sheet_name == "应急物资":

                df['剩余数量'] = df['剩余数量'].str.replace(r'\s*m³\s*', 'xl', regex=True)
                df['剩余数量'] = df['剩余数量'].str.replace(r'\s*㎡\s*', 'xl', regex=True)
                df['物资名称'] = df['物资名称'].str.replace(r'\s*㎡\s*', 'xl', regex=True)
                df['物资名称'] = df['物资名称'].str.replace(r'\s*m³\s*', 'xl', regex=True)

            # 处理“数据日期”列，过滤掉2020-01-01
            if '数据日期' in df.columns:
                before = len(df)
                df['数据日期'] = pd.to_datetime(df['数据日期'].astype(str), errors='coerce')
                df = df[df['数据日期'] != pd.Timestamp("2020-01-01")]
                after = len(df)
                print(f"✅ 已过滤 '2020-01-01'：保留 {after} / {before} 行")
                # 将 '数据日期' 列重新转换为字符串格式
                df['数据日期'] = df['数据日期'].dt.strftime('%Y-%m-%d %H:%M:%S')  # 转换为 'YYYY-MM-DD HH:MM:SS' 格式的字符串

# 特殊处理处理
            if sheet_name == "人员安全档案" and '年龄' in df.columns:
                df['年龄'] = pd.to_numeric(df['年龄'], errors='coerce', downcast='integer')

            if sheet_name == "企业基本信息":
                df['重大资产数量'] = df['重大资产数量'].str.replace(r'[\u4e00-\u9fa5]', '', regex=True)

            validation_result = validate_with_config(df, sheet_name, front_uuid)
            failed = [r for r in validation_result if r.get("status") == "失败"]
            if failed:
                print(f"❌ {sheet_name} 校验失败")
                all_passed = False
            else:
                print(f"✅ {sheet_name} 校验通过")
                all_dataframes[sheet_name] = df

        except Exception as e:
            print(f"❌ 工作表 {sheet_name} 处理异常: {e}")
            all_passed = False

    if not all_passed:
        print("\n❌ 存在校验错误，未写入主数据库")
        return

    print("\n✅ 所有工作表校验通过，开始写入主数据库")

    # 连接达梦数据库
    conn = connect_dm()

    total_rows_all = 0
    for sheet_name, df in all_dataframes.items():
        if df.empty:
            skip_tables.append(sheet_name)
            print(f"⚠️ 空表 {sheet_name} 跳过")
            continue
        try:
                           
            # 传递到上传函数
            upload_to_sql(df, sheet_name, conn, front_uuid)

            total_rows_all += len(df)
            successfully_written_tables.append(sheet_name)
            print(f"✅ 表 {sheet_name} 写入成功")
        except Exception as e:
            print(f"❌ 表 {sheet_name} 写入失败: {e}")

    print(f"\n🏁 完成：总记录数 {total_rows_all}")

    # ✅ 汇总状态记录写入“状态表”
    summary_record = pd.DataFrame([{
        'status': '成功',
        'table_name': '所有表',
        'error_message': '无',
        'error_line_number': None,
        'total_records': total_rows_all,
        'record_time': datetime.now()
    }])
    safe_upload_to_dm(summary_record, "status_information", conn, front_uuid,  mode='append')

    print(f"\n✅ 已成功写入 {len(successfully_written_tables)} 张表，跳过 {len(skip_tables)} 张空表，共 {len(successfully_written_tables) + len(skip_tables)} 张表")

if __name__ == "__main__":
    import_excel_to_dataframe(excel_file, front_uuid)
    
